package main

import (
	"fmt"
	"unicode/utf8"
)

//
var container = []string{"zero", "one", "two"}

func main() {
	block := "function"
	{
		block := "inner"
		fmt.Printf("The block is %s.\n", block)
	}
	fmt.Printf("The block is %s.\n", block)
	container := map[int]string{0: "zero", 1: "one", 2: "two"}
	fmt.Printf(container[1])
	//类型断言
	//把container变量的值转换为空接口值的interface{}(container)，以及用于判断前者的类型是否 为切片类型[]string的([]string)

	//方式一
	_, ok1 := interface{}(container).([]string)
	_, ok2 := interface{}(container).(map[int]string)
	if !(ok1 || ok2) {
		fmt.Printf("Error: unsupported container type: %T\n", container)
		return
	}
	fmt.Printf("The element is %q. (container type: %T)\n",
		container[1], container)

	//方式二

	elem, err := getElement(container)
	if err != nil {
		fmt.Printf("Error: %s\n", err)
		return
	}
	fmt.Printf("The element is %q. (container type: %T)\n",
		elem, container)




	//Unicode代码点  用于替换哪些未知字符
	fmt.Println(string(-1))

}
func getElement(containerI interface{}) (elem string, err error) {
	switch t := containerI.(type) {
	case []string:
		elem = t[1]
	case map[int]string:
		elem = t[1]
	default:
		err = fmt.Errorf("unsupported container type: %T", containerI)
		return
	}
	return elem, nil
}

//类型转换 对于整数类型值，整数常量之间的类型转换，原则上只要源值在目标类型的可表示范围内就是合法的

func int16Toint8() {
	var srcInt = int16(-255)  //-255的补码1111111100000001
	var detInt = int8(srcInt) //大转小 高位8个截取  -->  00000001 ==1
	fmt.Println(detInt)
}

//什么是别名类型 什么是潜在类型

type MyString = string //别名类型 和原类型无区别

type MyString2 string //注意  没有等号 这是一个新的类型 string可以称为MyString2的潜在类型
//潜在类型相同的不同类型的值之间可以进行类型转换，对于集合类型[]MyString2和[]String这么做不合法，应为他们的潜在类型不同 一个是MyString2 一个是String
//2个类型的潜在类型相同，它们的值之间不能进行等值和比较，变量之间不能相互赋值
type MyString3 string

func TestTypeConver() {
	//a:=MyString2("a")
	//b:=MyString3("b")
	//a=b//不能赋值
	//fmt.Println(a==b)//不能判等

}
func TestRune() {
	var str = "hello 你好"
	fmt.Println(len(str))
	//golang中的unicode/utf8包提供了用utf-8获取长度的方法
	fmt.Println("RuneCountInString:", utf8.RuneCountInString(str))

	//通过rune类型处理unicode字符
	fmt.Println("rune:", len([]rune(str)))
}
